Dataformのdependenciesオプションで依存関係を宣言する

Dataformのdependenciesオプションで依存関係を宣言する

Dataformでは、ref関数とdependenciesオプションの2つの方法でデータパイプラインの依存関係を表現することができます。今回はdependenciesオプションに関して使い方を書いてみました。
Clock Icon2024.09.09

概要

Dataformでは、データパイプラインの依存関係を管理するために主に2つの方法があります。

  1. ref関数を使用する方法
  2. dependenciesプロパティを使用する方法
    これらの方法を用いることで、ETL(Extract, Transform, Load)プロセスの実行順序を制御し、データの整合性を保つことができます。

ref関数を使用する方法

ref関数は、DataformのSQLXファイル内で他のテーブルやビューを参照するために使用します。
これにより、依存関係が明確になり、Dataformが自動的に依存関係を管理します。
以下のように使用します。多くの場合でこちらを使用することが多いのではないでしょうか。

config {
  type: "table"
}
SELECT * FROM ${ref("dataset.sample_table")}

しかしながら、ref関数を使用して依存関係を表す場合はSQL内でref関数を用いてテーブルを使用する必要があります。SQLで依存関係のあるテーブルを使用しないけれど、その処理が終わってから後続の処理を実行したい、という場合はdependenciesオプションを用いると実現することができます。
スクリーンショット 2024-09-09 9.15.26

上表のイメージとしては、処理CはSQL内で処理Aのテーブルを参照しており、処理Bは処理CのSQL内で直接参照されていないが処理C実行前に実行しておきたい処理です。dependenciesオプションを用いることで、このような依存関係を表現できます。

やってみる

dependenciesオプションはconfigブロック内で以下の形式で使用します。
dependencies: [ "依存関係ファイル名1", "依存関係ファイル名2"]
configブロック内での実装例は以下となります。

config {
  type: "table",
  dependencies: ["test_2"]
}

test_1、test_2、test_3という3つのSQLXファイルを作成し、test_3がtest_1・test_2に依存しているようにしてみます。

test_1
config {
  type: "table"
}
SELECT "test_1 table" AS col_1
test_2
config {
  type: "table"
}
SELECT "test_2 table" AS col_1
test_3
config {
  type: "table",
  dependencies: ["test_2"]
}
SELECT * FROM ${ref("test_1")} 

test_3のSQLXファイル内ではref関数でtest_1を、dependenciesオプションでtest_2を依存するように設定しています。
上記のSQLXを実装すると、以下のDAGとなります。
スクリーンショット 2024-09-09 9.50.36

test_3がtest_1・test_2に依存している関係を表現することができました。
それではtest_3のdependenciesオプションを削除してDAGをみてみます。
スクリーンショット 2024-09-09 9.52.41

test_2→test_3の依存関係がなくなっていることが確認できました。

上記より、dependenciesオプションを用いると依存関係を明示的にしていすることができることがわかりました。

まとめ

ref関数とdependenciesオプションの使い分けとしては以下となるイメージです。

ref関数 dependenciesオプション
SQL内で依存関係がある場合 SQL内で依存関係がないけれど依存させたい、明示的に依存関係を宣言したい

普段ref関数で事足りていたのですが、どうしてもref関数ではうまく動かないデータフローがありましてdependenciesを用いて依存関係を表現した案件があり今回記事にしてみました。
この記事がだれかのお役に立てば幸いです。それではまた。ナマステー

参考

https://cloud.google.com/dataform/docs/dependencies?hl=ja#config-block-dependencies

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.